繼續昨天的 Sequelize 連線,
今天我們要實作CRUD 與資料庫連接取得我們想要的資料。
首先,我們需要先建立連線資料庫的資料模型。
來到在 models
資料夾底下的 index.js 的檔案,加入負責存放資料模型。
在終端機執行 npm install sequelize-auto
指令,安裝 sequelize-auto 套件。
在終端機下指令,自動產生 book 資料表的資料模型。
npx sequelize-auto -h ${host} -d ${database} -u ${username} -x ${password} -p ${port} -o "${想要存放的位置}" -t ${table} --noInitModels
npx sequelize-auto -h localhost -d book -u root -x ${password} -p 3306 -o "./models/mysql" -t booktest --noInitModels
module.exports = function(sequelize, DataTypes) {
return sequelize.define('booktest', {
id: {
autoIncrement: true,
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
},
bookName: {
type: DataTypes.STRING(50),
allowNull: true
}
}, {
sequelize,
tableName: 'booktest',
timestamps: true,
indexes: [
{
name: "PRIMARY",
unique: true,
using: "BTREE",
fields: [
{ name: "id" },
]
},
]
});
};
接下來回到 models\index.js,引入 booktest 資料模型。
models\index.js
const Sequelize = require('sequelize')
const sequelize = new Sequelize('book', 'root', '', {
host: 'localhost',
dialect: 'mysql'
})
// 引入 booktest 模型
const booktest = require('./mysql/booktest')(sequelize, Sequelize)
module.exports = {
booktest
}
在 Day 11 我們有介紹了 MySQL CRUD 的 SQL 指令,
現在我們來比對一下,就可以知道使用 Sequelize 帶來的方便。
.findAll()
取得該資料表所有資料
MySQL
SELECT * FROM `booktest`
-- 讀取 booktest 資料表的所有資料
Sequelize
booktest.findAll({raw: true})
// raw: true 代表查詢結果返回的是資料庫原始資料,不会包含任何額外的方法或 Sequelize 模型的功能。
.update(where{條件})
更新資料
MySQL
UPDATE `booktest` SET `bookName` = 'testBook1' WHERE id = 1
-- 將 booktest 資料表 id = 1 的 bookName 欄位資料改為 'testBook1'
Sequelize
booktest.update('testBook1',{
where: {
id : 1
}
})
.create()
新增一筆資料
MySQL
INSERT INTO `booktest` (`bookName`) VALUES
('testBook')
-- 在 booktest 的資料表新增欄位 `bookName` 為 'testBook' 的資料
Sequelize
booktest.create({ bookName: 'testBook' }, { raw: true })
.destroy(where{條件})
刪除資料
MySQL
DELETE FROM `booktest` WHERE id = 1
-- 將 booktest 資料表 id = 1 的資料刪除
Sequelize
booktest.destroy({
where: {
id : 1
}
})
是不是看起來簡化很多呢?
接下來可以來修改一下我們原本的程式。
我們先在 routes\modules
資料夾底下新建立一個 bookBySequelize.js
檔案,讓原本 book.js
使用 MySQL 連線的部分可以先留著。
將原本在 book.js
的路由複製一份到 bookBySequelize.js
。
引入剛才設定 Sequelize 的相關模組。
const { booktest } = require('../../models/index')
// 引入連線與資料模型等相關模組
修改 MySQL 連線的地方,改為使用 Sequelize 連線。
// routes\modules\bookBySequelize.js
router.get('/', async (req, res) => {
try {
const books = await booktest.findAll({raw: true})
console.log(books)
} catch (error) {
console.error("An error occurred:", error);
}
res.render('page',{'text': 'Get a book'})
})
// define the book route by post method
router.post('/', async (req, res) => {
const bookName = req.body.bookName // 設定一個要新增的書名
try {
const books = await booktest.create({ bookName: bookName }, { raw: true })
} catch (error) {
console.error("An error occurred:", error)
}
// res.send('Post a book')
res.render('page',{'text': `add a new book: ${bookName}`})
})
// define the book route by delete method
router.delete('/:id', async (req, res) => {
const id = req.params.id
try {
const books = await booktest.destroy({
where: {
id : id
}
})
} catch (error) {
console.error("An error occurred:", error)
}
// res.send('Delete the book')
res.render('page',{'text': `Delete the book number ${id}`})
})
最後把 routes\index.js
修改一下,改為使用我們新調整的 bookBySequelize.js 檔案。
// routes\index.js
const express = require('express')
const router = express.Router()
// const book = require('./modules/book')
const book = require('./modules/bookBySequelize')
router.use('/book', book)
module.exports = router
測試一下每一個方法,是不是都可以順利的運作,這樣我們就學會使用基本的 Sequelize 與資料庫做資料交換了哦!
試著新增一個名為 postNewBook 的書。
查看資料庫有沒有寫進去。
如果想要更深入了解 Sequelize ,也可以參考他的官網,
都有很詳細的說明與範例!
經過了好幾天的介紹,以上有關資料庫連線的部分就先介紹到這裡!
後面會開始將這半個月所學的部分做一個小專案,
謝謝大家持續看我鐵人的介紹,你們的支持都是我每天發文的動力。
參考資料: